package com.yxx.strategy.loginStrategyImpl;

import com.yxx.config.properties.GiteeProperties;
import com.yxx.constant.LoginConstant;
import com.yxx.entityModel.dto.GitUserInfoDTO;
import com.yxx.entityModel.dto.SocialTokenDTO;
import com.yxx.entityModel.dto.SocialUserInfoDTO;
import com.yxx.entityModel.dto.TokenDTO;
import com.yxx.entityModel.vo.request.CodeRequest;
import com.yxx.enums.LoginTypeEnum;
import com.yxx.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * Gitee登录策略
 * @author yuxiangxun
 * @date 2025/2/6
 * @apiNote
 */
@Service("giteeLoginStrategyImpl")
@Slf4j
public class GiteeLoginStrategyImpl extends AbstractLoginStrategyImpl{

    @Resource
    private GiteeProperties giteeProperties;

    @Resource
    private RestTemplate restTemplate;

    /**
     * 获取 Gitee 第三方Token
     * 模板方法
     * @param data data
     * @return 第三方Token
     */
    @Override
    public SocialTokenDTO getSocialTokenDTO(CodeRequest data) {
        // 获取 Gitee 上的 Token
        TokenDTO giteeToken = getGiteeToken(data.getCode());
        // 返回 Gitee 上的 Token 信息
        return SocialTokenDTO.builder()
                .accessToken(giteeToken.getAccess_token())
                .loginType(LoginTypeEnum.GITEE.getLoginType())
                .build();
    }

    /**
     * 获取 Gitee 上的 Token
     * @param code
     * @return
     */
    private TokenDTO getGiteeToken(String code) {
        // 通过授权码 code 换取 accessToken
        MultiValueMap<String,String> giteeData = new LinkedMultiValueMap<>();
        // Gitee 的 Token 请求参数  从配置文件中获取
        giteeData.add(LoginConstant.GRANT_TYPE,giteeProperties.getGrantType());
        giteeData.add(LoginConstant.CODE,code);
        giteeData.add(LoginConstant.CLIENT_ID,giteeProperties.getClientId());
        giteeData.add(LoginConstant.REDIRECT_URI,giteeProperties.getRedirectUri());
        giteeData.add(LoginConstant.CLIENT_SECRET,giteeProperties.getClientSecret());
        try{
            // 发送 Http 请求    Gitee 的 Token 接口 URL , 请求方法为 POST , 请求体为 giteeData , 请求头为 null, 响应体的映射类型
            return restTemplate.exchange(giteeProperties.getAccessTokenUrl(),
                        HttpMethod.POST,
                        new HttpEntity<>(giteeData, null),
                        TokenDTO.class)
                    .getBody();
        }catch(Exception e){
            throw new ServiceException("Gitee登录错误");
        }
    }



    /**
     * 获取 gitee 第三方用户信息
     * @param socialTokenDTO 第三方token
     * @return
     */
    @Override
    public SocialUserInfoDTO getSocialUserInfo(SocialTokenDTO socialTokenDTO) {
        Map<String,String> dataMap = new HashMap<>(1);
        // 请求参数
        dataMap.put(LoginConstant.ACCESS_TOKEN, socialTokenDTO.getAccessToken());
        // Gitee 用户信息
        GitUserInfoDTO gitUserInfoDTO = restTemplate.getForObject(
                giteeProperties.getUserInfoUrl(),
                GitUserInfoDTO.class,
                dataMap);
        // 返回用户信息
        return SocialUserInfoDTO.builder()
                .avatar(Objects.requireNonNull(gitUserInfoDTO).getAvatar_url())
                .id(gitUserInfoDTO.getId())
                .nickname(gitUserInfoDTO.getName())
                .build();
    }




}
